/* *****************************************************************
 *
 * Download latest Blinker library here:
 * https://github.com/blinker-iot/blinker-library/archive/master.zip
 * 
 * 
 * Blinker is a cross-hardware, cross-platform solution for the IoT. 
 * It provides APP, device and server support, 
 * and uses public cloud services for data transmission and storage.
 * It can be used in smart home, data monitoring and other fields 
 * to help users build Internet of Things projects better and faster.
 * 
 * Make sure installed 2.7.4 or later ESP8266/Arduino package,
 * if use ESP8266 with Blinker.
 * https://github.com/esp8266/Arduino/releases
 * 
 * Make sure installed 1.0.5 or later ESP32/Arduino package,
 * if use ESP32 with Blinker.
 * https://github.com/espressif/arduino-esp32/releases
 * 
 * Docs: https://diandeng.tech/doc
 *       
 * 
 * *****************************************************************
 * 
 * Blinker 库下载地址:
 * https://github.com/blinker-iot/blinker-library/archive/master.zip
 * 
 * Blinker 是一套跨硬件、跨平台的物联网解决方案，提供APP端、设备端、
 * 服务器端支持，使用公有云服务进行数据传输存储。可用于智能家居、
 * 数据监测等领域，可以帮助用户更好更快地搭建物联网项目。
 * 
 * 如果使用 ESP8266 接入 Blinker,
 * 请确保安装了 2.7.4 或更新的 ESP8266/Arduino 支持包。
 * https://github.com/esp8266/Arduino/releases
 * 
 * 如果使用 ESP32 接入 Blinker,
 * 请确保安装了 1.0.5 或更新的 ESP32/Arduino 支持包。
 * https://github.com/espressif/arduino-esp32/releases
 * 
 * 文档: https://diandeng.tech/doc
 *       
 * 
 * *****************************************************************/
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

#define BLINKER_BLE

#include <Blinker.h>
#include "FastLED.h"  // 此示例程序需要使用FastLED库

BlinkerButton ButtonRed("btn-red");
BlinkerButton ButtonBlue("btn-blue");
BlinkerNumber Number1("num-abc");

int counter = 0;

#define NUM_LEDS 255 // LED灯珠数量
#define DZ1 4		  // Arduino输出控制信号引脚 长点阵控制引脚
#define DZ2 32
#define DZ3 26
#define DZ4 19
#define DZ5 25
#define DZ6 12
#define DZ7 14
#define DZ8 27 // 上灯带控制引脚（四边形）
#define DZ9 13
#define DZ 23 //板子上面自带的灯珠
// #define DZ1 25              // Arduino输出控制信号引脚
#define LED_TYPE WS2812B // LED灯带型号
#define COLOR_ORDER GRB	 // RGB灯珠中红色、绿色、蓝色LED的排列顺序

uint8_t max_bright = 255; // LED亮度控制变量，可使用数值为 0 ～ 255， 数值越大则光带亮度越高
CRGB leds_DZ1[NUM_LEDS];  // 建立点阵leds
CRGB leds_DZ2[NUM_LEDS];  // 建立点阵leds
CRGB leds_DZ3[NUM_LEDS];  // 建立点阵leds
CRGB leds_DZ4[NUM_LEDS];  // 建立点阵leds
CRGB leds_DZ5[NUM_LEDS];  // 建立点阵leds
CRGB leds_DZ6[NUM_LEDS];  // 建立点阵leds
CRGB leds_DZ7[NUM_LEDS];  // 建立点阵leds
CRGB leds_DZ8[NUM_LEDS];  // 建立点阵leds
CRGB leds_DZ9[NUM_LEDS];  // 建立点阵leds
CRGB leds_DZ[NUM_LEDS];  // 建立点阵leds

// 点亮所有灯珠
void light_all(int color)
{
	// fill_sold section全部点亮/熄灭，没有时间差 CRGB::Blue
	fill_solid(leds_DZ1, NUM_LEDS, color);
	fill_solid(leds_DZ2, NUM_LEDS, color);
	fill_solid(leds_DZ3, NUM_LEDS, color);
	fill_solid(leds_DZ4, NUM_LEDS, color);
	fill_solid(leds_DZ5, NUM_LEDS, color);
	fill_solid(leds_DZ6, NUM_LEDS, color);
	fill_solid(leds_DZ7, NUM_LEDS, color);
	fill_solid(leds_DZ8, NUM_LEDS, color);
	fill_solid(leds_DZ9, NUM_LEDS, color);
	fill_solid(leds_DZ, NUM_LEDS, color);
	FastLED.show();
}

void off_all()
{
	// fill_sold section全部点亮/熄灭，没有时间差 CRGB::Blue
	fill_solid(leds_DZ1, NUM_LEDS, CRGB::Black);
	fill_solid(leds_DZ2, NUM_LEDS, CRGB::Black);
	fill_solid(leds_DZ3, NUM_LEDS, CRGB::Black);
	fill_solid(leds_DZ4, NUM_LEDS, CRGB::Black);
	fill_solid(leds_DZ5, NUM_LEDS, CRGB::Black);
	fill_solid(leds_DZ6, NUM_LEDS, CRGB::Black);
	fill_solid(leds_DZ7, NUM_LEDS, CRGB::Black);
	fill_solid(leds_DZ8, NUM_LEDS, CRGB::Black);
	fill_solid(leds_DZ9, NUM_LEDS, CRGB::Black);
	fill_solid(leds_DZ, NUM_LEDS, CRGB::Black);
	FastLED.show();
}

void button_red_callback(const String & state)
{
    BLINKER_LOG("get button state: ", state);
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
	if (state == "tap")
	{
		light_all(CRGB::Red);
	}
}

void button_blue_callback(const String & state)
{
    BLINKER_LOG("get button state: ", state);
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
	if (state == "tap")
	{
		light_all(CRGB::Blue);
	}
}

void dataRead(const String & data)
{
    BLINKER_LOG("Blinker readString: ", data);
    counter++;
    Number1.print(counter);
}

void setup()
{
    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);
    
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, HIGH);
    
    Blinker.begin();
    Blinker.attachData(dataRead);

    ButtonRed.attach(button_red_callback);
	ButtonBlue.attach(button_blue_callback);

	LEDS.addLeds<LED_TYPE, DZ1, COLOR_ORDER>(leds_DZ1, NUM_LEDS); // 初始化点阵
	LEDS.addLeds<LED_TYPE, DZ2, COLOR_ORDER>(leds_DZ2, NUM_LEDS); // 初始化点阵
	LEDS.addLeds<LED_TYPE, DZ3, COLOR_ORDER>(leds_DZ3, NUM_LEDS); // 初始化点阵
	LEDS.addLeds<LED_TYPE, DZ4, COLOR_ORDER>(leds_DZ4, NUM_LEDS); // 初始化点阵
	LEDS.addLeds<LED_TYPE, DZ5, COLOR_ORDER>(leds_DZ5, NUM_LEDS); // 初始化点阵
	LEDS.addLeds<LED_TYPE, DZ6, COLOR_ORDER>(leds_DZ6, NUM_LEDS); // 初始化点阵
	LEDS.addLeds<LED_TYPE, DZ7, COLOR_ORDER>(leds_DZ7, NUM_LEDS); // 初始化点阵
	LEDS.addLeds<LED_TYPE, DZ8, COLOR_ORDER>(leds_DZ8, NUM_LEDS); // 初始化点阵
	LEDS.addLeds<LED_TYPE, DZ9, COLOR_ORDER>(leds_DZ9, NUM_LEDS); // 初始化点阵
	LEDS.addLeds<LED_TYPE, DZ, COLOR_ORDER>(leds_DZ, NUM_LEDS); // 初始化点阵
	FastLED.setBrightness(max_bright);							  // 设置灯带亮度
}

void loop()
{
    Blinker.run();
}